package com.quanxiaoha.weblog.common.utils;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

public class TextSplitterUtil {

    public static void main(String[] args) {

        String text = "嗯，用户想要将一段文字按照段落分割，并且每块大约100字左右。这是一个文本处理需求，用户可能是在处理文章、小说或者某种需要分块展示的内容。\n" +
                "\n" +
                "用户明确要求使用Java实现，看来用户有一定的编程基础。从用户的问题描述来看，用户可能是在开发某种文本处理工具或者内容管理系统。\n" +
                "\n" +
                "我看到了很多相关的搜索结果，其中提到了一些Java中字符串分割的方法。比如中提到了使用substring方法按字符个数分割字符串的基本思路，这个方法可以满足用户按字数分割的需求。中提到了处理文本自然段落的方法，虽然用户没有要求按自然段落分割，但这个思路可以借鉴。中提到了处理小说分章节的方法，虽然用户的分块要求更细，但原理有相似之处。\n" +
                "\n" +
                "对于实现方案，我可以考虑两种主要方法：基于固定字符数的分割和基于段落感知的分割。固定字符数分割比较简单直接，就是每100个字符切一刀。但这样可能会在单词或句子中间断开，影响可读性。段落感知的分割会更智能一些，会尝试在段落结束的地方分割，同时尽量接近100字的目标。\n" +
                "\n" +
                "在代码实现上，我会考虑使用Java的String.substring方法进行基本分割。为了提高实用性，可以添加一些边界处理，比如避免在中文句子中间断开，或者在英文单词中间断开。\n" +
                "\n" +
                "我会在回答中提供一个完整的Java类实现，包含以下功能：按固定字符数分割的简单方法；更智能的段落感知分割方法；处理中英文混合文本的能力；边界情况处理（如文本不足100字，段落边界识别等）。\n" +
                "\n" +
                "为了让代码更易用，我会设计一个简单的API，让用户可以传入文本和期望的字数，返回分割后的字符串列表。还会考虑添加一些提示信息，帮助用户理解分割结果。\n" +
                "\n" +
                "最后，我会提供一个使用示例，展示如何调用这个方法，并处理分割结果。这样用户可以直接复制代码到自己的项目中使用，或者根据自己的需求进行调整。\n" +
                "\n" +
                "在回答组织上，我会先解释设计思路，然后给出完整代码，最后说明使用方法和注意事项。这样用户既能理解实现原理，又能直接使用代码解决问题。";
        List<String> list = new ArrayList<>();
        String[] split = text.split("\n");
        for (int i = 0; i < split.length; i++) {
            if(!Objects.equals(split[i], "")){
                List<String> strings = splitTextByPunctuationWithNewlineAndLength(text, 150);
                list.addAll(strings);
            }
        }
        list.forEach(x->{
            System.out.println("分段符：");
            System.out.println(x);
        });
    }

    public static List<String> splitText(String text){

        List<String> list = new ArrayList<>();
        String[] split = text.split("\n");
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < split.length; i++) {
            if(!Objects.equals(split[i], "")){
                stringBuilder.append(split[i]);
                stringBuilder.append("\n");
            }else {
                List<String> strings = splitTextByPunctuationWithNewlineAndLength(stringBuilder.toString(), 150);
                list.addAll(strings);
                stringBuilder = new StringBuilder();
            }
        }
        List<String> strings = splitTextByPunctuationWithNewlineAndLength(stringBuilder.toString(), 150);
        list.addAll(strings);
        list.forEach(x->{
            System.out.println("分段符：");
            System.out.println(x);
        });
        return list;
    }

    /**
     * 按段落优先分割，并将每段再按指定长度分块
     * @param text 输入文本
     * @param length 每块最大长度
     * @return 分割后的字符串列表
     */
    public static List<String> splitTextByParagraphAndLength(String text, int length) {
        List<String> result = new ArrayList<>();
        if (text == null || text.isEmpty() || length <= 0) {
            return result;
        }
        // 支持 \r\n, \r, \n 作为段落分隔
        String[] paragraphs = text.split("(\r\n|\r|\n)+");
        for (String para : paragraphs) {
            para = para.trim();
            if (para.isEmpty()) continue;
            int start = 0;
            while (start < para.length()) {
                int end = Math.min(start + length, para.length());
                result.add(para.substring(start, end));
                start = end;
            }
        }
        return result;
    }

    /**
     * 按句子结尾切分，每块约100字但不截断句子
     * @param text 输入文本
     * @param length 每块最大长度
     * @return 分割后的字符串列表
     */
    public static List<String> splitTextBySentenceAndLength(String text, int length) {
        List<String> result = new ArrayList<>();
        if (text == null || text.isEmpty() || length <= 0) {
            return result;
        }
        // 按中文句号、问号、感叹号分句（保留分隔符）
        String[] sentences = text.split("(?<=[。！？])");
        StringBuilder current = new StringBuilder();
        for (String sentence : sentences) {
            if (current.length() + sentence.length() > length && current.length() > 0) {
                result.add(current.toString());
                current.setLength(0);
            }
            current.append(sentence);
        }
        if (current.length() > 0) {
            result.add(current.toString());
        }
        return result;
    }

    /**
     * 每句后加换行，100字左右为一块，每块以完整句子结尾
     * @param text 输入文本
     * @param length 每块最大长度
     * @return 分割后的字符串列表
     */
    public static List<String> splitTextBySentenceWithNewlineAndLength(String text, int length) {
        List<String> result = new ArrayList<>();
        if (text == null || text.isEmpty() || length <= 0) {
            return result;
        }
        // 按中文句号、问号、感叹号分句（保留分隔符）
        String[] sentences = text.split("(?<=[。！？])");
        StringBuilder current = new StringBuilder();
        int currentLen = 0;
        for (String sentence : sentences) {
            String s = sentence.trim();
            if (s.isEmpty()) continue;
            s = s + "\n";
            if (currentLen + s.length() > length && currentLen > 0) {
                result.add(current.toString());
                current.setLength(0);
                currentLen = 0;
            }
            current.append(s);
            currentLen += s.length();
        }
        if (currentLen > 0) {
            result.add(current.toString());
        }
        return result;
    }

    /**
     * 遇到标点符号结尾且大于10字就换行，100字左右为一块，每块以完整"行"结尾
     * @param text 输入文本
     * @param length 每块最大长度
     * @return 分割后的字符串列表
     */
    public static List<String> splitTextByPunctuationWithNewlineAndLength(String text, int length) {
        List<String> result = new ArrayList<>();
        if (text == null || text.isEmpty() || length <= 0) {
            return result;
        }
        // 标点符号集合
        String punctuation = "。！？；，,!?;";
        List<String> lines = new ArrayList<>();
        StringBuilder line = new StringBuilder();
        for (int i = 0; i < text.length(); i++) {
            char c = text.charAt(i);
            line.append(c);
            if (punctuation.indexOf(c) != -1 && line.length() > 10) {
                lines.add(line.toString());
                line.setLength(0);
            }
        }
        if (line.length() > 0) {
            lines.add(line.toString());
        }
        // 按100字分块，每块以完整"行"结尾
        StringBuilder current = new StringBuilder();
        int currentLen = 0;
        for (String l : lines) {
            String s = l.endsWith("\n") ? l : l + "\n";
            if (currentLen + s.length() > length && currentLen > 0) {
                result.add(current.toString());
                current.setLength(0);
                currentLen = 0;
            }
            current.append(s);
            currentLen += s.length();
        }
        if (currentLen > 0) {
            result.add(current.toString());
        }
        return result;
    }
} 